<?php

class Produccion extends CI_Controller {

    function __construct() {
        parent::__construct();
        $this->load->model('pedido_model');
        $this->load->model('produccion_model');
        require('PDFReport.php');
         require('BusquedaTabu.php');
       
    }
     public function  encuentraPed(){
        $fecha = $this->input->get('fechadesd');
        $fechahasta = $this->input->get('fechahasta');
        $codigo = $this->input->get('codOrden');
        $cliente = $this->input->get('codCliente');
        $ruc = $this->input->get('ruc');
        $razon = $this->input->get('razon');
        $nombres = $this->input->get('nombres');
        $apellidos = $this->input->get('apellidos');
        $dni = $this->input->get('dni');
        $session_data = $this->session->userdata['logged_in'];
        
        $usuarioSesion=$session_data['user_id'];
        $IdEstado = $this->input->get('estado');
        $pedidos = $this->pedido_model->buscarPedido($IdEstado,$usuarioSesion,$fecha,$fechahasta,$codigo,$cliente,$ruc,$razon,$dni,$nombres,$apellidos);
       
        

        $cad = "<div style='overflow:scroll; height:250px'>
        <table class='table table-bordered'>
        <thead>";
        $cad = $cad . "<th>Código Pedido</th><th>Código Cliente</th> <th>RUC</th><th>Razón</th>";
        $cad = $cad . "<th>Fecha Registro</th> <th>Fecha Entrega</th><th>Nombre Representate</th><th>Prioridad</th>    
        </thead>
        <tbody>";       
        foreach ($pedidos as $orden) {            
            $cad2 = "<tr class='tr_hover_nothing' onmouseover=\"this.className='tr_hover_color';\"
                onmouseout=\"this.className='tr_hover_nothing';\"
                onClick=\"cargarPedido(this,'codPed','cliente', 'fechaEntr', 'priorid');limpiardiv('resultados')\">
            <td align='center' valign='middle'>" . $orden['codPed'] . "</td>
            <td align='center' valign='middle'>" . $orden['codclient'] . "</td>
            <td align='center' valign='middle'>" . $orden['ruc'] . "</td>
            <td align='center' valign='middle'>" . $orden['razon'] . "</td>
            <td align='center' valign='middle'>" . $orden['Fechareg'] . "</td>
            <td align='center' valign='middle'>" . $orden['FechaEnt'] . "</td>            
            <td align='center' valign='middle'>" . $orden['nombr']." ".$orden['apellidos']. "</td>";
            if($orden['prioridad']=='3'){
                $cad2=$cad2."<td align='center' valign='middle'>Alta</td>";
            }
            else if($orden['prioridad']=='2'){
                $cad2=$cad2."<td align='center' valign='middle'>Media</td>";
            }
            else if($orden['prioridad']=='1'){
                $cad2=$cad2."<td align='center' valign='middle'>Baja</td>";
            } 
            $cad = $cad . $cad2;
            $cad2 = "";
        }
        $cad = $cad . "</tbody></table></div>";
        echo $cad;
    }
    public function cargarItems(){
                   
            $codPed= $this->input->get('codPed');
            $codCliente = $this->input->get('codCliente');  
            $lineasPed=$this->pedido_model->buscarLineaPedido($codPed,$codCliente);
            $cantlineaPed=count($lineasPed);
            $cad="<input type='hidden' name='cantLinea' value='".$cantlineaPed."'>";
            $i=1;$size2=6;  $tam=8;          
            foreach($lineasPed as $linea){                
                $cad=$cad."<div class='accordion-group'>
                            <div class='accordion-heading'>
                            <a class='accordion-toggle' data-toggle='collapse' data-parent='#itemProduccion' href='#collapse".$i."'>
                                ".$linea['nomItem']."
                            </a>
                            </div>
                            <div id='collapse".$i."' class='accordion-body collapse'>
                            <div class='accordion-inner'>
                                <table><tbody><tr><td align='center' valign='middle'>
                                <div class='control-group'>
                                    <label class='control-label' for='codItem'.$i.''>Código</label>
                                <div class='controls'><input type='text' class='input-mini' name='codItem[]' id='codItem'.$i.'' readonly='readonly'
                                    value='".$linea['codlinea']."'></div>
                                </div>
                                </td><td align='center' valign='middle'>
                                <div class='control-group'>
                                    <label class='control-label' for='cantida'.$i.''>Cantidad</label>
                                <div class='controls'><input type='text' class='input-mini' name='cantida[]' id='cantida'.$i.'' readonly='readonly'
                                    value='".$linea['cantidad']."'></div>
                                </div>
                                </td></tr><tr><td align='center' valign='middle'>
                                <div class='control-group'>
                                    <label class='control-label' for='nomCate'.$i.''>Categoría</label>
                                <div class='controls'><input type='text' class='input-medium' name='nomCate[]' id='nomCate'.$i.'' readonly='readonly'
                                    value='".$linea['nomCateg']."'></div>
                                </div>                                
                                </td>
                                <td>
                                <div class='control-group'>
                                <label class='control-label' for='fechaIni".$i."'>Inicio de Produción</label>
                                <div class='controls'>
                                <input type='text' class='datePicker span".$tam."'
                                        value='".date("d-m-Y")."' data-date-format='dd-mm-yyyy' name='fechaIni[]' id='fechaIni".$i."'>
                                </div>
                                </div>
                                </td></tr>
                                </tbody></table>
                                 <table  class='table table-bordered'>        
                                    <thead>                                   
                                    <th>Codigo Trab.</th>
                                    <th>Nombre</th>
                                    <th>Categoria</th>
                                    <th>Horas Estimadas</th>
                                    <th>Unidad</th>                                    
                                    <th>Horas Programadas</th>
                                    <th>Importancia 1(Baja)-5(Alta)</th>";
                 $trabajos=$this->pedido_model->buscarTrabajosLin($linea['codlinea']);
                 $cantTrabajo=count($trabajos);
                 $cad=$cad."<th>Orden trabajo (1-".$cantTrabajo.")</th>";
                 foreach($trabajos as $trabajo){
                     $cad2="<tr><td align='center' valign='middle'>".$trabajo['codTar']." <input type='hidden' value='".$trabajo['codTar']."' id='codTar".$linea['nomItem']."' name='codTar[]' >
                         </td><td align='center' valign='middle'>".$trabajo['nom']." <input type='hidden' value='".$trabajo['nom']."' id='nomTar".$linea['nomItem']."' name='nomTar[]' > 
                         </td><td align='center' valign='middle'>".$trabajo['nomcatg']."<input type='hidden' value='".$trabajo['nomcatg']."' id='nomCatTar".$linea['nomItem']."' name='nomCatTar[]' >
                         </td><td align='center' valign='middle'>".$trabajo['cant']."<input type='hidden' value='".$trabajo['cant']."' id='cantTra".$linea['nomItem']."' name='cantTra' >
                             </td><td align='center' valign='middle'>Horas/Hombre</td><td align='center' valign='middle'><input type='text' class='input span".$size2."' id='horPrg".$linea['nomItem']."' name='horPrg[]'  ></td>".
                             "<td align='center' valign='middle'><input type='text' class='input span".$size2."' id='pesoPrio".$linea['nomItem']."' name='pesoPrio[]'  ></td>
                                 <td align='center' valign='middle'><input type='text' class='input span".$size2."' id='ordenTrab".$linea['nomItem']."' name='ordenTrab[]'  ></td>";                 
                     $cad=$cad.$cad2;
                 }
                $cad=$cad."</tbody></table><input type='hidden' name='cantTabajos[]' value='".$cantTrabajo."'></div></div>
                    </div>";
                $i++;
            }
            echo $cad;
    }
    public function cargarResumen()
    {
         $login=$this->loggedIn();
        $args['title'] = 'produccion';
        $args['content'] = 'produccion/resumen';        
        $session_data = $this->session->userdata['logged_in'];
        $args['username'] = $login['username'];
        $this->load->view('view',$args);

    }
    public function planificar(){
        
        $login=$this->loggedIn();
        $args['title'] = 'planificar';
        $args['content'] = 'produccion/planificacion';        
        $session_data = $this->session->userdata['logged_in'];
        $args['username'] = $login['username'];
        $this->load->view('view',$args);
    }
    public function graficogantt(){
        $session_data = $this->session->userdata['logged_in'];        
        $usuarioSesion=$session_data['user_id'];       
        $bloquesGantt=$this->produccion_model->obtenerbloque($usuarioSesion);
        $default= array(
            'title'      => 'Trabajos',
            'cellwidth'  => 25,
            'cellheight' => 35);
        $args['bloquesGantt'] = $bloquesGantt;
        $args['default'] = $default;
        $login=$this->loggedIn();
        $args['title'] = 'Mi Producción';
        $args['content'] = 'produccion/graficogantt';        
        //$session_data = $this->session->userdata['logged_in'];
        $args['username'] = $login['username'];
        $this->load->view('view',$args);
    }
    public function buscaPos($array,$id){
        $pos=0;
        $no=-1;
        $elem=count($array);
       for ($i=0;$i<$elem;$i++){
           if($array[$i]==$id){
               return $pos;
           } else $pos++;
       }
       return $no;
    }
    public function microtime_float()
    {
        list($useg, $seg) = explode(" ", microtime());
        return ((float)$useg + (float)$seg);
    }
    public function mejorarPrograma(){
        $session_data = $this->session->userdata['logged_in'];        
        $usuarioSesion=$session_data['user_id'];
        $tiempo_inicio = $this->microtime_float();
       $matriz=  $this->generarMatriz($usuarioSesion);
     
        $busTabu=new BusquedaTabu(ITERACIONES,LONGMEMO,PERMANECIA);   
        $busTabu->SetMatriTrabxPed($matriz);
        $costoActual=$busTabu->funObjetivo($matriz);
         $busTabu->BusquedaTabu();//se realiza la busqueda
        $mejorada=$busTabu->GetMatriTrabxPed();     
        $costoMejorado=$busTabu->funObjetivo($mejorada);
        $idPlanMejorado=  $this->produccion_model->guardarMejoraTemp($usuarioSesion,$mejorada);
        $arreglo=array();
        //se genera el gannt        
        $bloques=array();
        $idEstacion=0;  
        $idsEstaciones=array();
        $conBloques=array();
        $estaciones=$this->produccion_model->todasEstaciones($usuarioSesion);
       
       foreach($mejorada as $grupos){           
           $bloques=array();
           
           foreach($grupos as $grup){               
               if($grup['Ini']!="" && $grup['C']!="" ){
//                  print_r('('.$grup['Linea'].')');print_r('  '); print_r($grup['Ini']);print_r('  ');print_r($grup['C']);print_r('  ');
                if(!in_array($grup['est'], $idsEstaciones,true)){
                    array_push($idsEstaciones,$grup['est']);
                }  
                $aux=array('codi'=>$grup['id'],'Color'=>$grup['col'],'Horas'=>$grup['Horas'],'cant'=>$grup['cant'],'nom'=>$grup['nom'],'Linea'=>$grup['Linea'],'start'=>$grup['Ini'],'end'=>$grup['C']);
                
                array_push($bloques,$aux);
                }
            } 
            array_push($conBloques,$bloques);
            unset($bloques);
       } 

       foreach($estaciones as $est){
               $pos=$this->buscaPos($idsEstaciones,$est['idEst']);
               if($pos !=-1)
               $bloque=$conBloques[$pos];
               else $bloque=array();
               $auxx=array('label'=>'EST'.$est['idEst'].':  '.$est['nom'],'bloques'=>$bloque);              
               array_push($arreglo,$auxx);
           }
         if($costoActual==0){
             $reduc=0;
         } else{
              $reduc=round(100-((intval($costoMejorado)/intval($costoActual))*100));
         }           
        echo "<input type='hidden' name='idPlan' id='idPlan' value='$idPlanMejorado'>";     
        echo "<span class='label label-warning'>Costo Anterior: ".$costoActual."</span>";
        echo "<span class='label label-success'>Costo Mejorado: ".$costoMejorado."</span>";
        echo "<span class='label label-info'>Reducción del : ".$reduc."% </span>";
        $default= array(
        'title'      => 'Trabajos',
        'cellwidth'  => 25,
        'cellheight' => 35);
        require(RUTA_GANTT.'gantti.php'); 
        $gantti = new Gantti($arreglo, $default);
        $tiempo_fin = $this->microtime_float();
        $tiempo = $tiempo_fin - $tiempo_inicio;
        if($tiempo<200000){
            for ($i=0; $i<3000000; $i++){
            }
        }
        echo $gantti;
    }
    public function generarMatriz($usuarioSesion){        
        $estaciones=$this->produccion_model->obtenerEstaciones($usuarioSesion);
        $trabajos=  $this->produccion_model->obtenertrabajos($usuarioSesion);
        $matriz=array();
        foreach($estaciones as $est){
            $trabxEsta=array();
            foreach($trabajos as $trab){
                if($est['id']==$trab['est']){
                    array_push($trabxEsta, $trab);
                }
            }
            //se forma la matriz
            if(count($trabxEsta)!=0){
                 array_push($matriz,$trabxEsta);
            }          
            unset($trabxEsta);
        }
        
//        //se buscara las predescesoras en le arreglo
            $antecesor=array();
            $filas=count($matriz);
            $colum=0;
      
        for($m=0;$m<$filas;$m++){
            $colum=count($matriz[$m]);           
            for($n=0;$n<$colum;$n++){
                if($matriz[$m][$n]['pred']!=''){//si tiene predescesor
                    //se busca el predescesor
                    $pred=$this->buscarPredescesor($matriz, $matriz[$m][$n]['pred']);                    
                    $matriz[$m][$n]['Pred']=$pred;
//                    array_push($matriz[$m][$n], array('Pred'=>$pred));
                    $antecesor=array('fil'=>$m,'col'=>$n);
                    //se setea el antesecor
                    $matriz[$pred['fil']][$pred['col']]['Antec']=$antecesor;
//                    array_push($matriz[$pred['fil']][$pred['col']], array('Antec'=>$antecesor));
                }
            }
        }
        return $matriz;
    }
    public function buscarPredescesor($matriz,$idEstacion){
        $corr=array();
        $filas=count($matriz);
        for($m=0;$m<$filas;$m++){
            $colum=count($matriz[$m]);
            for($n=0;$n<$colum;$n++){
                if($matriz[$m][$n]['id']==$idEstacion){
                    $corr=array('fil'=>$m,'col'=>$n);break;
                }
            }
        } 
                   
       return $corr;
    }
    public function generarPlanificacion(){
        $login=$this->loggedIn();
        $cantLineaPed= $this->input->post('cantLinea');
        $codLinePed= $this->input->post('codItem');
        $codTrabxLinea= $this->input->post('codTar');
        $horaProgram= $this->input->post('horPrg');
        $importancia= $this->input->post('pesoPrio');        
        $fechaInicio= $this->input->post('fechaIni');
        $cantTabajos=$this->input->post('cantTabajos'); 
        $ordenTabajos=$this->input->post('ordenTrab');
        //$datos: compueto por: FechaInicio, FechaFin, 
        //DetalleTrabajoxPedido, HorasProgramadas, IdLineaPedido, idEstacion
        $session_data = $this->session->userdata['logged_in'];        
        $usuarioSesion=$session_data['user_id'];
        $datos=array();
        $estEsta=array('Estado'=>1);
        $ide="";$arrayPrede=array();
        $arrayTrab=array();       
        for ($i=0;$i<$cantLineaPed;$i++){
            $codLinea=$codLinePed[$i];            
            $datosLinea=array('FechaInicioPed'=>$fechaInicio[$i]);
            $idEstaci=$this->produccion_model-> actualizaLinea($datosLinea,$codLinea);
            //se guardara los trabajos
            $cantTrabajos=$cantTabajos[$i];
            for ($j=0;$j<$cantTrabajos;$j++){              
              $idEstaci=$this->produccion_model-> buscarEstacion($codTrabxLinea[$j],$usuarioSesion);
              $dias=  ceil($horaProgram[$j]/DIA_LABORAL);
              //se suman los dias
              $fecha = date('Y-m-d',strtotime($fechaInicio[$i]));
              $suma="+".$dias." day";
              $fechafin = strtotime ( $suma , strtotime ( $fecha ) ) ;
              $fechafin = date ( 'Y-m-d' , $fechafin );
              $datos=array('Estado'=>1,'IdTrabajo'=>$codTrabxLinea[$j],'IdLineaPedido'=>$codLinea,'HorasProgramadas'=>$horaProgram[$j],
             'Importancia'=>$importancia[$j],'idEstacion'=>$idEstaci,'DiasProgramados'=>$dias,'FechaFin'=>$fechafin,'FechaInicio'=>date('Y-m-d',strtotime($fechaInicio[$i])));
              $ide=$this->produccion_model->gurdarTrabajoxItem($datos);
              $aux=array('Orden'=>$ordenTabajos[$j],'IdTrabajo'=>$ide);
              array_push($arrayPrede,$aux);
              $this->produccion_model->actualizarEstacion($estEsta,$idEstaci);              
            }            
            $ok=$this->produccion_model->ordeaerTarba($codLinea);
            $this->actualizarPrede($arrayPrede);
        } 
        
        $this->graficogantt();
    }
    public function buscarAnt($arrayPrede,$ord){
        
        foreach($arrayPrede as $arrays){
            if($arrays['Orden']==$ord){
               return  $arrays['IdTrabajo'];
            }
        }
        return '-1';
    }
    public function actualizarPrede($arrayPrede){
        
        foreach($arrayPrede as $arrays){
            if($arrays['Orden']!='1'){
                $orde=strval (intval($arrays['Orden'])-1);
                $id=$this->buscarAnt($arrayPrede,  strval($orde));
                if($id!='-1'){
                    $dato=array('predescesora'=>$id,'Orden'=>$arrays['Orden']);
                    $this->produccion_model->actuTrabajoxItem($arrays['IdTrabajo'],$dato); 
                }
                else {
//                    print_r($arrayPrede['Orden']);
                    $dato=array('Orden'=>$arrays['Orden']);
                    $this->produccion_model->actuTrabajoxItem($arrays['IdTrabajo'],$dato); 
                }
            }else {                  
                $dato=array('Orden'=>$arrays['Orden']);
                $this->produccion_model->actuTrabajoxItem($arrays['IdTrabajo'],$dato); 
            }
        }
    }
    public function guardarMejora(){
        $idPlan= $this->input->post('idPlanFijo');
        $this->produccion_model->guardarNuevoPlan($idPlan);        
        $session_data = $this->session->userdata['logged_in'];        
        $usuarioSesion=$session_data['user_id'];       
        $bloquesGantt=$this->produccion_model->obtenerbloque($usuarioSesion);
        $default= array(
            'title'      => 'Trabajos',
            'cellwidth'  => 25,
            'cellheight' => 35);
        $args['bloquesGantt'] = $bloquesGantt;
        $args['default'] = $default;
        $login=$this->loggedIn();
        $args['title'] = 'Mi Producción';
        $args['confirm'] = 'NuevoPlan';
        $args['mensaje'] = 'Se generó el nuevo plan';
        $args['content'] = 'produccion/graficogantt';        
        //$session_data = $this->session->userdata['logged_in'];
        $args['username'] = $login['username'];
        $this->load->view('view',$args);
    }
    
     public function seguimiento($mensaje=''){
        
        $login=$this->loggedIn();
        $args['title'] = 'Seguimiento';
        $args['content'] = 'produccion/seguimiento';        
        $session_data = $this->session->userdata['logged_in'];
        $user=$session_data['user_id'];  
        $trabajos=$this->produccion_model->seguimiento($user);
        $m=0;
        foreach($trabajos as $trab){
            
            if($trab['estado']==0) $trabajos[$m]['estado']='Terminó';
            else if($trab['estado']==1) $trabajos[$m]['estado']='En Espera';
            else if($trab['estado']==2) $trabajos[$m]['estado']='Iniciado';
            if($trab['Horas']=='') $trabajos[$m]['Horas']=0;
            if($trab['Porce']=='') $trabajos[$m]['Porce']=100; else $trabajos[$m]['Porce']=100-floatval ($trab['Porce']);
            $m++;
        }
        if($mensaje!=''){
            $args['confirm'] = 'Seguimiento';
            $args['mensaje'] = $mensaje;
        }            
        $args['trabajos'] = $trabajos;
        $args['username'] = $login['username'];
        $this->load->view('view',$args);
    }
     public function estaciones(){
        
        $login=$this->loggedIn();
        $args['title'] = 'Estaciones';
        $args['content'] = 'produccion/misEstaciones';        
        $session_data = $this->session->userdata['logged_in'];
        $user=$session_data['user_id'];   
        $estaciones=$this->produccion_model->misEstaciones($user);
        $envio=array();
        foreach($estaciones as $esta){
            $horasTrba=$this->produccion_model->trabajoEstacion($esta['cod']);
            $total=0;
            if(count($horasTrba)>0 || $horasTrba[0]==''){
                $total=$horasTrba[0]['tot'];
            }
            $aux=array();
            $equipo=$this->produccion_model->equipo($esta['cod']);
            $nomEq='';
            if(count($equipo)>0 ){
                $nomEq=$equipo[0]['equipo'];
            }
          
            $aux=array('cod'=>$esta['cod'],'NomCentro'=>$esta['NomCentro'],'NomTrabajo'=>$esta['NomTrabajo'],
            'NomPersona'=>$esta['NomPersona'],'equipo'=>$nomEq,'Total'=>$total,'Fin'=>$esta['Fin']);
          
            array_push($envio,$aux);
        }        
        $args['estaciones'] = $envio;
        $args['username'] = $login['username'];
        $this->load->view('view',$args);
    }
    
    public function guardarSeguimiento(){
       
        $idTrabaLinea= $this->input->post('idTrabajos');
        $horas= $this->input->post('horas');
        $porFalt= $this->input->post('porFalt');
        $horasHombre= $this->input->post('horasHombre');
        $porAvance= $this->input->post('porAvance');        
        $m=0;        
        foreach($idTrabaLinea as $trabxlin){
            $horasTrab=0;
            $porc=0;
            if($horasHombre[$m]!=''){
                $horasTrab=$horas[$m]+$horasHombre[$m];
            } else  $horasTrab=$horas[$m];
            if($porAvance[$m]!=''){
                $porc=100-floatval($porFalt[$m])+floatval($porAvance[$m]);
            } else  $porc=100-floatval($porFalt[$m]);
            $dato=array();
            if($porc=='100')
                $dato=array('HorasTrabajadas'=>$horasTrab,'PorcentajeAvance'=>$porc,'Estado'=>0);
            else $dato=array('HorasTrabajadas'=>$horasTrab,'PorcentajeAvance'=>$porc);
            $this->produccion_model->actualizarTrabajos($dato,$trabxlin);
        }
         $this->seguimiento('Se guardó correctmente su seguimiento.');   
        
    }
    
    public function impriEstaciones(){
        $login=$this->loggedIn();
        $nomDoc = $login['username'].'_MisEstaciones';
        $pdf=new PDFReport();
        $header=array('Codigo','Centro Trabajo','Trabajo','Trabajador','Equipo Asignado','Total de H/H','Fecha Liberacion');
        
        $session_data = $this->session->userdata['logged_in'];
        $user=$session_data['user_id'];   
        $estaciones=$this->produccion_model->misEstaciones($user);
        $data=array();
        foreach($estaciones as $esta){
            $horasTrba=$this->produccion_model->trabajoEstacion($esta['cod']);
            $total=0;
            if(count($horasTrba)>0 || $horasTrba[0]==''){
                $total=$horasTrba[0]['tot'];
            }
            $aux=array();
            $equipo=$this->produccion_model->equipo($esta['cod']);
            $nomEq='--';
            if(count($equipo)>0 ){
                $nomEq=$equipo[0]['equipo'];
            }
            if($esta['Fin']=='') $esta['Fin']='--';
          
            $aux=array($esta['cod'],$esta['NomCentro'],$esta['NomTrabajo'],
            $esta['NomPersona'],$nomEq,$total,$esta['Fin']);
          
            array_push($data,$aux);
        }
        $pdf->AliasNbPages();
        $pdf->crearPDFTabla('Mis Estaciones',$header,$data,40,10);        
        $pdf->Output($nomDoc.'.pdf', 'I');
    }
    
    public function funObjetivo($matriz){//Esta matriz sera bidimensional conteniendo 
    //los trabajos por cada pedido los valores de Importancia(w), Fecha Culminacion(C), Fecha de Entrega del pedido(d)
        $resultado=0;
        if(count($matriz)!=0){
            foreach($matriz as $matrizTrabPed){
                foreach($matrizTrabPed as $TrabxPedi){
                    $curretnCul=strtotime($TrabxPedi['C']);
                    $curretnEnt=strtotime($TrabxPedi['d']);
                    $horas=($curretnCul-$curretnEnt)/ 60/ 60;
                    $resultado+=max(($TrabxPedi['w']*($horas)),0);
                }
            }
        }        
        return $resultado;
    }
}
?>
